package com.wang.redis;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanResult;

public class RedisJava {

	private Jedis jedis;

	
	@Before
	public void setJedis(){
		// 连接本地的 Redis 服务
//		jedis = new Jedis("localhost");
		jedis = new Jedis("127.0.0.1", 6379);
//		jedis.auth("abc123");
		System.out.println("服务正在运行: " + jedis.ping());
	}
	
	@Test
	public void testString(){
//		Redis key demo		
//		System.out.println("清空库中所有数据："+jedis.flushDB());
//		 System.out.println("判断key999键是否存在："+jedis.exists("key999")); 
//		Set<String> keys = jedis.keys("*");
//		Iterator<String> it = keys.iterator();
//		while (it.hasNext()) {
//			String key = it.next();
//			System.out.println(key);
//		}
		
		jedis.set("myKey", "abc123");
		System.out.println(jedis.get("myKey"));
		jedis.append("myKey", "456");
		System.out.println(jedis.get("myKey"));
		jedis.del("myKey");
		System.out.println(jedis.get("myKey"));;
		
		//mset 设置多个键值对
		jedis.mset("name","simon","age","26");
		System.out.println(jedis.get("name"));
		//用于将键的整数值递增1。如果键不存在，则在执行操作之前将其设置为0。 如果键包含错误类型的值或包含无法表示
//		为整数的字符串，则会返回错误。此操作限于64位有符号整数。
		jedis.incr("age");
		System.out.println(jedis.get("age"));
	}
	
	@Test
	public void testList(){
		jedis.del("myList");
		jedis.lpush("myList", "google");
		jedis.lpush("myList","baidu");
		jedis.lpush("myList", "taobao");
		System.out.println("lenth: "+ jedis.llen("myList"));
		
		//-1表示取得所有
		List<String> myList = jedis.lrange("myList", 0, -1);
		System.out.println(myList);
		
	}
	
	@Test
	public void testMap(){		
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "simon");
        map.put("age", "100");
        map.put("email", "test123@163.com");
		jedis.hmset("myHash", map);
		List<String> list = jedis.hmget("myHash", "name","age");
		System.out.println(list);
	
		//删除map中的某个键值
		jedis.hdel("myHash","name");		
        System.out.println("age:" + jedis.hmget("myHash", "age")); //因为删除了，所以返回的是null
        System.out.println("user的键中存放的值的个数:" + jedis.hlen("myHash")); //返回key为user的键中存放的值的个数2
        System.out.println("是否存在key为user的记录:" + jedis.exists("myHash"));//是否存在key为user的记录 返回true
        System.out.println("user对象中的所有key:" + jedis.hkeys("myHash"));//返回user对象中的所有key
        System.out.println("user对象中的所有value:" + jedis.hvals("myHash"));//返回map对象中的所有value

        Iterator<String> it = jedis.hkeys("myHash").iterator();
        while (it.hasNext()) {
            String key = it.next();
            System.out.println(key + ":" + jedis.hmget("myHash", key));
        }
        jedis.del("myHash");
	}
	
	@Test
	public void testSet(){
		//add member
		jedis.sadd("mySet", "name","age","email");
		//remove member
		jedis.srem("mySet", "email");
		//get members
		System.out.println(jedis.smembers("mySet"));
		System.out.println("mySet中的value:" + jedis.smembers("mySet"));// 获取所有加入mySet的value
		System.out.println("chx是否是mySet中的元素:" + jedis.sismember("mySet", "chx"));// 判断chx是否是mySet集合中的元素
		System.out.println("集合中的一个随机元素:" + jedis.srandmember("mySet"));// 返回集合中的一个随机元素
		System.out.println("mySet中元素的个数:" + jedis.scard("mySet"));
	
	}
	 /**
     * 排序
     */
	@Test
	public void testRange() {		
		jedis.del("number");// 先删除数据，再进行测试
		jedis.rpush("number", "4");// 将一个或多个值插入到列表的尾部
		jedis.rpush("number", "5");
		jedis.rpush("number", "3");

		jedis.lpush("number", "9");// 将一个或多个值插入到列表头部
		jedis.lpush("number", "1");
		jedis.lpush("number", "2");
		System.out.println(jedis.lrange("number", 0, jedis.llen("number")));
		System.out.println("排序:" + jedis.sort("number"));
		System.out.println(jedis.lrange("number", 0, -1));// 不改变原来的排序
		jedis.del("number");// 测试完删除数据
	}
	
}
